这些是在Dev-cpp C++ 5.4.2上编写的两个简单的C++示例:
float a, b, c; if (a | b & a | c) printf("x = %.2f\tF = %.0f\n", x, F); else printf("x = %.2f\tF = %.2f\n", x, F);
而这段代码:
float a, b, c; if (a || b && a || c) printf("x = %.2f\tF = %.0f\n", x, F); else printf("x = %.2f\tF = %.2f\n", x, F);
有谁能告诉我之间的差异||
> |
和&
> &&
.第二个代码有效,但首先没有.编译器给出了一条错误消息:
[错误]类型'float'和'float'到二进制'运算符&'的操作数无效.
JSF.. 11
运营商|
,&
和~
作用于平行的各个位.它们只能用于整数类型. a | b
每个位的独立OR运算a
与相应的位进行,b
以产生该位的结果.
运算符||
,&&
并!
作为单个true
/ false
值作用于每个操作数.可以使用隐式转换为的任何数据类型bool
.许多数据类型,包括float
使用隐含!=0
操作隐式转换为bool .
||
并且&&
还"短路".这意味着只要第一个操作数可以确定结果的值,就不会计算第二个操作数.例:
ptr && (*ptr==7)
如果ptr
为零,则结果为false,而没有任何因解除引用零而导致段错误的风险.
你可以与之形成对比(int)ptr & (*ptr)
.忽略这个甚至是想要的奇怪操作的事实,如果(int)ptr
为零,则整个结果将为零,因此人们可能认为在这种情况下你不需要第二个操作数.但无论如何,该计划可能会计算两者.
运营商|
,&
和~
作用于平行的各个位.它们只能用于整数类型. a | b
每个位的独立OR运算a
与相应的位进行,b
以产生该位的结果.
运算符||
,&&
并!
作为单个true
/ false
值作用于每个操作数.可以使用隐式转换为的任何数据类型bool
.许多数据类型,包括float
使用隐含!=0
操作隐式转换为bool .
||
并且&&
还"短路".这意味着只要第一个操作数可以确定结果的值,就不会计算第二个操作数.例:
ptr && (*ptr==7)
如果ptr
为零,则结果为false,而没有任何因解除引用零而导致段错误的风险.
你可以与之形成对比(int)ptr & (*ptr)
.忽略这个甚至是想要的奇怪操作的事实,如果(int)ptr
为零,则整个结果将为零,因此人们可能认为在这种情况下你不需要第二个操作数.但无论如何,该计划可能会计算两者.